//////////////////////////////////////////////////////////////////////////
// NO_Member
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
#define NO_TAL_EXPORT

//////////////////////////////////////////////////////////////////////////
#include "NO_Externs.h"
#include "NO_Member.h"

//////////////////////////////////////////////////////////////////////////
// NO_IMember
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
NO_IMember::NO_IMember(std::string name):name(name),next(0){}
NO_IMember::NO_IMember(const NO_Int8* name):name(name),next(0){}
NO_IMember::~NO_IMember(){}

//////////////////////////////////////////////////////////////////////////
NO_UInt32			NO_IMember::getID(void)		const {return id;}
const std::string&	NO_IMember::getName(void)	const {return name;}

//////////////////////////////////////////////////////////////////////////
// NO_MemberFriend
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
void		NO_MemberFriend::setID		(NO_IMember* m, NO_UInt32 id)	const {m->id = id;}
NO_IMember* NO_MemberFriend::getNext	(const NO_IMember* m)			const {return m->next;}
void		NO_MemberFriend::setNext	(NO_IMember* m, NO_IMember* n)	const {m->next = n;}

//////////////////////////////////////////////////////////////////////////
// NO_MemberList
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
// con/destruction
//////////////////////////////////////////////////////////////////////////
NO_MemberList::NO_MemberList(void):first(0),last(0){}
NO_MemberList::~NO_MemberList()
{
	const NO_IMember * iter = first;
	const NO_IMember * kill = 0;
	while(iter)
	{
		kill = iter;
		iter = getNext(iter);
		delete kill;
	}
}

//////////////////////////////////////////////////////////////////////////
// modify
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
NO_Boolean NO_MemberList::addMember(NO_IMember* obj)
{
	NO_UInt32 hash = noGetHash(obj->getName().c_str());
	setID(obj, hash);
	if(!first){first = obj;}
	if(last){setNext(last,obj);}
	last = obj;
	return 1;
}

//////////////////////////////////////////////////////////////////////////
// retrieve
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
const NO_IMember* NO_MemberList::findMemberImpl(const NO_Int8* name) const
{
	NO_UInt32 hash = noGetHash(name);
	return findMemberImpl(hash);
}

//////////////////////////////////////////////////////////////////////////
const NO_IMember* NO_MemberList::findMemberImpl(NO_UInt32 ID) const
{ 
	const NO_IMember * iter = first;
	while(iter)
	{
		if (iter->getID()==ID){return iter;}
		iter = getNext(iter);
	}
	return 0;
}

//////////////////////////////////////////////////////////////////////////
const NO_IMember* NO_MemberList::beginMemberImpl(void)				const {return first;}
const NO_IMember* NO_MemberList::endMemberImpl	(void)				const {return 0;}
const NO_IMember* NO_MemberList::nextMemberImpl	(const NO_IMember*i)const {return getNext(i);}

//////////////////////////////////////////////////////////////////////////
// NoneMember
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////
// con/destruction
//////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////
NO_NoneMembers::NO_NoneMembers(void){}
NO_NoneMembers::~NO_NoneMembers(void){}

//////////////////////////////////////////////////////////////////////////
// retrieve
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
const NO_IMember* NO_NoneMembers::findMemberImpl(const NO_Int8* name)	const {return 0;}
const NO_IMember* NO_NoneMembers::findMemberImpl(NO_UInt32 ID)			const {return 0;}

//////////////////////////////////////////////////////////////////////////
const NO_IMember * NO_NoneMembers::beginMemberImpl	(void)				const {return 0;}
const NO_IMember * NO_NoneMembers::endMemberImpl	(void)				const {return 0;}
const NO_IMember * NO_NoneMembers::nextMemberImpl	(const NO_IMember*)	const {return 0;}

